package jsoup;

import cn.demoncat.util.http.JsoupUtil;
import cn.demoncat.util.lang.RegexpUtil;
import cn.demoncat.util.lang.StringUtil;
import lombok.Data;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

/**
 * 京东查询
 *
 * 1、无法获取价格
 * 2、无法获取详情（显示加载中）
 *
 * @author 延晓磊
 * @since 2024年07月09日
 */
public class JdQuery {

    /**
     * 商品信息
     */
    @Data
    public static class Item{

        private String id;
        private String name;
        private String brand;
        private String model;
        // 主图
        private String img;
        // 轮播图
        private String slide;
        // 详情
        private String detail;
    }

    /**
     * 获取图片域名
     *
     * @param url   //img10.360buyimg.com/xxx
     * @return http://img10.360buyimg.com/sku/
     */
    private static String getImgDomain(String url){
        return "https://" + RegexpUtil.search(url, "img.+com").get(0) + "/sku/";
    }

    /**
     * 查询商品详情
     *
     * @param id    商品编码
     * @param imgConvert    图片转换
     * @return
     */
    public static Item getItem(String id, Function<String,String> imgConvert)  {
        Item item = new Item();
        item.setId(id);
        List<String> imgs = new ArrayList<>();
        if (imgConvert == null) {
            imgConvert = s -> s;
        }
        // 请求Html
        Document doc = JsoupUtil.get("https://item.jd.com/" + id +".html");
        try {
            // 商品名称
            item.setName(StringUtils.trimToEmpty(doc.getElementsByClass("sku-name").get(0).text()));
            // 商品属性
            Elements elements = doc.getElementsByClass("p-attr-item");
            if (CollectionUtils.isNotEmpty(elements)) {
                for (Element attr : elements) {
                    if (attr.getElementsByClass("p-attr-key").get(0).text().contains("品牌")) {
                        item.setBrand(StringUtils.trimToEmpty(attr.getElementsByClass("p-attr-value").get(0).text()));
                    }else if (attr.getElementsByClass("p-attr-key").get(0).text().contains("型号")) {
                        item.setModel(StringUtils.trimToEmpty(attr.getElementsByClass("p-attr-value").get(0).text()));
                    }
                }
            }
            // 商品品牌
            Element element = doc.getElementById("parameter-brand");
            if (element != null) {
                item.setBrand(StringUtils.trimToEmpty(element.getElementsByTag("li").get(0).attr("title")));
            }
            // 商品图片
            for (Element img : doc.select(".spec-items img")) {
                imgs.add(imgConvert.apply(getImgDomain(img.attr("src")) + img.attr("data-url")));
            }
            item.setImg(imgs.get(0));
            item.setSlide(StringUtil.join(imgs));
            // 商品详情
            StringBuilder detail = new StringBuilder();
            elements = doc.getElementById("J-detail-content").getElementsByTag("style");
            if (CollectionUtils.isNotEmpty(elements)) {
                for (String img : RegexpUtil.search(elements.get(0).html(), "//img.+\\)")) {
                    // 抽取图片
                    detail.append("<p>").append("<img src=\"").append(imgConvert.apply("https:" + img.substring(0, img.length()-1))).append("\"/></p>\r\n");
                }
            }
            item.setDetail(detail.toString());
        }catch (RuntimeException e){
            System.err.println("拉取商品失败：https://item.jd.com/" + id);
            throw e;
        }
        return item;
    }

}
